package main

import (
	"fmt"
	"time"
)

func main() {
	testSelect()	
	setSelectTimeout()
	writeMsg()
}

func writeMsg()  {
	c1 := make(chan int,2) // 创建信道c1，消息类型为int

	c1 <- 2 // 往c1信息中传递消息2

	select {
	case c1 <-4 :
		fmt.Println("c1==", <- c1)
		fmt.Println("c1==", <- c1)
	default:
		fmt.Println("channel blocking")
	}
}

func setTimeout(ch chan bool, t int){
	 // time.Sleep 接收一个time.Duration类型，以纳秒为单位
	 // 直接 time.Second * num 是int类型
	 // 通过 time.Second * time.Duration(num) 转为time.Duration类型
	time.Sleep(time.Second * time.Duration(t)) // 传入数据为多少秒为单位，暂时停止运行
	ch <- true // 之后往信道ch中发送消息
}
func setSelectTimeout()  {
	c1 := make(chan string, 1) // 建立信道c1,信道中传递消息为string类型 chan === channel 
	c2 := make(chan string, 1) // 建立信道 c2, 信道中传递消息为 string类型
	timeout := make(chan bool, 1) // 建立信道 timeout，信道中传递消息为 bool类型

	// 使用go重新建议一个线程，执行makeTimeout函数
	go setTimeout(timeout, 2); // 2秒之后返回信道timeout中传递消息true

	select {
		case msg1 := <- c1:
			fmt.Println("c1信道消息:", msg1)
		case msg2 := <- c2:
			fmt.Println("c2信道消息:", msg2)
		case timeout := <- timeout:
			fmt.Println("timeout信道消息:", timeout)
		
	}

}

// 类似于信道/通道的操作
func testSelect()  {
	c1 := make(chan string, 1) // 创建信道
	c2 := make(chan string, 1) // 创建信道

	c2 <- "hello" // 往c2发送消息

	c1 <- "world" // 往c1发送消息

	// 开启一个协程，发送数据到信道
	go func(){
		time.Sleep(time.Second * 1)
		c1 <- "world"
	}()

	select {
		case msg1 := <- c1:
			fmt.Println("c1接受到消息，赋值给msg1", msg1)
		case msg2 := <- c2:
			fmt.Println("c2接受到消息，赋值给msg2", msg2)
		default:
			fmt.Println("无消息")
	}

}

